
/////////////////////////////////////////////////////////////////////////////////
//
//  线性表 ： http://c.biancheng.net/view/3334.html struct 传递
//
/////////////////////////////////////////////////////////////////////////////////

#include<iostream>

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

typedef struct Table{
    int * head;     // 声明了一个名为head的长度不确定的数组，也叫 动态数组
    int length;     // 记录当前顺序表的长度
    int size;       // 记录顺序表分配的存储容量
} Table ;

Table table_create()
{
    Table table;
    table.head = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
    table.length = 0;
    table.size = LIST_INIT_SIZE;
    return table;
}

// 在 第index 位置 插入 elem 元素， index开始所有元素后移（反向，从尾部移动） 。
Table table_insert(Table t, int index, int target)
{
    if (index < 0|| index >t.length)
    {
        return t;
    }

    if(t.length >= t.size)
    {
        int newSize = t.size + LISTINCREMENT;
        t.head = (int *)realloc(t.head,newSize*sizeof(int) );
        t.size = newSize;
    }

    for (int i = t.length; i > index;i--)
    {
        t.head[i] = t.head[i - 1];
    }
    t.head[index] = target;
    t.length++;
    return t;
}

Table table_remove(Table t, int index)
{
    if (index < 0|| index >t.length-1)
    {
        return t;
    }


    for (; index < t.length - 1;index++)
    {
        t.head[index] = t.head[index + 1];
    }
    t.length--;

    return t;
}

int table_find(Table t, int target)
{
    int pos = -1;

    for (int i = 0; i < t.length; i++)
    {
        if (t.head[i] == target)
        {
            pos = i;
            break;
        }
    }
    return pos;
}

void showList(Table lst)
{
    for (int i = 0; i < lst.length; i++)
    {
        std::cout << lst.head[i] << " ";
    }
    std::cout << std::endl;
}


int main()
{
    Table t1=table_create();
    for (int i=1; i<=5; i++) {
        t1.head[i-1]=i;
        t1.length++;
    }
    std::cout <<  " 原顺序表 " <<std::endl;
    showList(t1);

    std::cout <<  " 删除元素1: " <<std::endl;
    t1=table_remove(t1, 1);
    showList(t1);

    std::cout <<  " 在第2的位置插入元素5" <<std::endl;
    t1=table_insert(t1, 2, 5);
    showList(t1);

    std::cout <<  " 查找元素3的位置: " <<std::endl;
    int add=table_find(t1, 3);
    printf("%d\n",add);

    // std::cout <<  " 将元素3改为6: " <<std::endl;
    // t1=amendTable(t1, 3, 6);
    // showList(t1);

    return EXIT_SUCCESS;
}

